package com.dcits;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import java.io.File;
import java.io.IOException;
import java.util.Collection;

/**
 * 默认编译阶段执行JSP编译
 */
@Mojo(name = "bulid-jsp", defaultPhase = LifecyclePhase.COMPILE)
public class JspBuilder extends AbstractMojo {

    @Parameter(name = "sourceFileType")
    private String sourceFileType;

    @Parameter(name = "targetFileType")
    private String targetFileType;

    @Parameter(name = "basePath")
    private String basePath;

    @Parameter(name = "sourcePath")
    private String sourcePath;

    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("============= start jsp build =============");
        getLog().info("config path is:" + basePath);
        getLog().info("source path is:" + sourcePath);
        runBuildJsp(basePath,sourcePath);
    }

    /**
     * 查找给定目录（及其子目录）中与扩展名数组匹配的文件。
     * <p>
     * directory 要搜索的目录
     * <p>
     * extensions：要过滤的扩展数组，例如{“java”、“xml”}，为 null，返回所有文件。
     * <p>
     * ecursive：true 表示搜索所有子目录
     * <p>
     * fileFilter：文件过滤器，IOFileFilter 是一个接口，常用的实现类有：SuffixFileFilter(文件后缀过滤器)、PrefixFileFilter(文件前缀过滤器)、TrueFileFilter(总是返回true的文件过滤器)、FalseFileFilter(总是返回false的文件过滤器)
     * <p>
     * dirFilter：与上面同理
     *
     * @param tmpBasePath
     * @param tmpSourcePath
     */
    private void runBuildJsp(String tmpBasePath, String tmpSourcePath) {
        if (StringUtils.isNotEmpty(tmpBasePath) && StringUtils.isNotEmpty(tmpSourcePath)) {
            String fileFlags[] = {sourceFileType};
            Collection<File> listFiles = FileUtils.listFiles(new File(tmpBasePath +File.separator+tmpSourcePath), fileFlags, true);
            for (File singleFile : listFiles) {
                renameFile(singleFile);
                singleFile.delete();
                getLog().info(singleFile.getAbsolutePath()+":build success");
            }
        }
    }

    /**
     * 重命名文件
     * @param tmpFile
     */
    private void renameFile(File tmpFile) {
        String tmpFileName = tmpFile.getName();
        if (tmpFileName.endsWith("." + sourceFileType)) {
            tmpFileName = tmpFileName.substring(0, tmpFileName.lastIndexOf(".") + 1);
            tmpFileName += targetFileType;
            try {
                FileUtils.moveFile(tmpFile,new File(tmpFile.getParent() + File.separator + tmpFileName));
            } catch (IOException e) {
                getLog().error(tmpFileName+":build error");
                getLog().error(e);
            }
        }
    }

}

